package com.tianji.StragyHttp.service.Impl;



import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.tianji.StragyHttp.dto.BaseCustomerAnalysisDTO;
import com.tianji.StragyHttp.dto.CrmHttpReqDTO;
import com.tianji.StragyHttp.dto.CrmHttpRespDTO;
import com.tianji.StragyHttp.utils.CrmHttpApiUtil;
import com.tianji.StragyHttp.utils.ExportUtil;
import com.tianji.StragyHttp.utils.RedisKit;
import com.tianji.StragyHttp.utils.SessionUtil;
import com.tianji.exception.BizException;

import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;

import static com.tianji.StragyHttp.constant.RedisKey.CUSTOMER_ANALYSIS;

/**
 * @author jia
 * @version v1.0
 * @Description: 策略接口
 * @date 2024/11/19 17:08
 */
public abstract class AnalysisStrategy<T> {


    /**
     * 对外开放的分析接口
     *
     * @param dto 原始请求dto
     * @return 分析结果
     */
    public T analyze(BaseCustomerAnalysisDTO dto) {
        // 组装reqDTO
        List<CrmHttpReqDTO> reqDTOs = generateReqDTO(dto);
        // 发起批量http请求
        List<CrmHttpRespDTO> respDTOs = CrmHttpApiUtil.httpSubApis(reqDTOs);
        // 处理结果
        return handleRespDTO(respDTOs, dto);
    }


    /**
     * 生成子系统请求对象
     *
     * @param dto 原请求dto
     * @return http请求对象
     */
    protected List<CrmHttpReqDTO> generateReqDTO(BaseCustomerAnalysisDTO dto) {
        return Collections.emptyList();
    }

    /**
     * 子系统请求结果转换
     *
     * @param respDTOs 子系统请求结果
     * @param dto      原请求dto
     * @return 转换结果
     */
    protected T handleRespDTO(List<CrmHttpRespDTO> respDTOs, BaseCustomerAnalysisDTO dto) {
        return null;
    }


    public Boolean export(BaseCustomerAnalysisDTO dto) {
        String key = String.format(CUSTOMER_ANALYSIS, dto.getBizType(), DigestUtil.md5Hex(dto.toString()));
        if (!RedisKit.lock(key, 120, TimeUnit.SECONDS)) {
            throw new RuntimeException("数据正在导出中，请不要重复提交");
        }
        ExportUtil.export(SessionUtil.getUser(),
                dto.getRemark(), dto.getCustomerAnalysisEnum().getName(), getExportFunction(dto));
        return true;
    }

    /**
     * 生成导出function
     * 未确定哪些场景不需要导出 不设为抽象方法
     *
     * @param dto 原始请求dto
     * @return 导出function
     */
    protected Function<ExcelWriter, String> getExportFunction(BaseCustomerAnalysisDTO dto) {
        return (writer) -> {
            throw new BizException("客户分析导出 需子类继承实现");
        };
    }

}
